# 1.单行注释
"""
2.多行注释
"""
import sys

print("Hello china")

# 3. 运算
# print(1 + 1)  # 2
# print(2 - 1)  # 1
# print(3 * 4)  # 12
# print(3 / 4)  # 0.75
print(8 // 4)  # 0
# print(3 % 4)  # 3
# print(2 ** 3)  # 8

# 4 或与非
print((3 > 2) and (3 < 5))  # True
print((1 > 3) or (9 < 2))  # False
print(not (2 > 1))  # false

# 5. in is

"""
in	存在	'A' in ['A', 'B', 'C']
not in	不存在	'h' not in ['A', 'B', 'C']
is	是	"hello" is "hello"
not is	不是	"hello" is not "hello"
"""
# 变量命名
# 在使用变量之前，需要对其先赋值。
# 变量名可以包括字母、数字、下划线、但变量名不能以数字开头。
# Python 变量名是大小写敏感的，foo != Foo。


first = 1
second = 2
print(first * second)

# 运行一下就好啦
set_1 = {"欢迎", "学习", "Python"}
print(set_1)
# 6 print
shop_list = ['apple', 'mango', 'carrot', 'banana']
print("This is printed without 'end' and 'sep'.")
for item in shop_list:
    print(item, end='\n', file=sys.stdout)

# if not False:
#     print('未通过')
# else:
#     print('通过')
#  7. 断言
assert (3 > 2)

# assert (3 > 7)

# 8.while 循环
count = 0
while count < 5:
    temp = input("猜一猜小姐姐想的是哪个数字？")
    guess = int(temp)
    if guess > 8:
        print("大了，大了")
    else:
        if guess == 8:
            print("你太了解小姐姐的心思了！")
            print("哼，猜对也没有奖励！")
            count = 5
        else:
            print("小了，小了")
    count = count + 1
print("游戏结束，不玩儿啦！")
# 9.while else循环
count = 0
while count < 5:
    print("%d is  less than 5" % count)
    count = count + 1
else:
    print("%d is not less than 5" % count)

# 10. for in 循环
for i in 'ILovePython8':
    print(i, end=' ')  # 不换行输出
print('\n')

# 11.  for循环
dic = {'a': 1, 'b': 2, 'c': 3, 'd': 4}

for key, value in dic.items():
    print(key, value, sep=':', end=' ', file=sys.stdout)

# 12. for else循环
# for 迭代变量 in 可迭代对象:
#     代码块
# else:
#     代码块
for num in range(10, 100):  # 迭代 10 到 20 之间的数字
    for i in range(2, num):  # 根据因子迭代
        if num % i == 0:  # 确定第一个因子
            j = num / i  # 计算第二个因子
            print('%d 等于 %d * %d' % (num, i, j))
            break  # 跳出当前循环
    else:  # 循环的 else 部分
        print(num, '是一个质数')

# 13.range()函数
#      range([start,] stop[, step=1])
# 这个BIF（Built-in functions）有三个参数，
# 其中用中括号括起来的两个表示这两个参数是可选的。
# step=1 表示第三个参数的默认值是1。

data = range(20, 40, 2)
for i in data:
    print(i)


# 14. enumerate()函数
# enumerate(sequence, [start=0])
# sequence：一个序列、迭代器或其他支持迭代对象。
# start：下标起始位置。
# 返回 enumerate(枚举) 对象


# 15 .break语句可以跳出当前所在层的循环。
# 16.continue终止本轮循环并开始下一轮循环。

# 17.pass 语句的意思是“不做任何事”，如果你在需要有语句的地方不写任何语句，那么解释器会提示出错，而 pass 语句就是用来解决这些问题的。
# pass是空语句，不做任何操作，只起到占位的作用，其作用是为了保持程序结构的完整性。尽管pass语句不做任何操作
# 但如果暂时不确定要在一个位置放上什么样的代码，
# 可以先放置一个pass语句，让代码可以正常运行。
def a_func():
    pass


# 18.列表推导式
#   [ expr for value in collection [if condition] ]

# x = [-4, -2, 0, 2, 4]
# y = [a * 2 for a in x]
# print(y)
# # [-8, -4, 0, 4, 8]


# x = [i for i in range(100) if (i % 2) != 0 and (i % 3) == 0]
# print(x)
# [-8, -4, 0, 4, 8]


# x = [(i, i ** 2) for i in range(6)]
# print(x)
# [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]

# x = [[i, j] for i in range(0, 3) for j in range(0, 3)]
# print(x)
# # [[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]]


# 18. 元组推导式
# ( expr for value in collection [if condition] )
a = (x for x in range(10))
print(a)

print(tuple(a))

# 19.字典推导式
# { key_expr: value_expr for value in collection [if condition] }
b = {i: i % 2 == 0 for i in range(10) if i % 3 == 0}
print(b)
# {0: True, 3: False, 6: True, 9: False}


# 20.集合推导式
# {expr for value in collection[ if condition]}

c = {i for i in [1, 2, 3, 4, 5, 5, 6, 4, 3, 2, 1]}
print(c)
# {1, 2, 3, 4, 5, 6}

# 21.其他
# next(iterator[, default])
# Return the next item from the iterator.
# If default is given and the iterator is exhausted,
# it is returned instead of raising StopIteration.
e = (i for i in range(10))
print(e)
# <generator object <genexps> at 0x0000007A0B8D01B0>
print(next(e))  # 0
print(next(e))  # 1
for each in e:
    print(each, end=' ')
# 2 3 4 5 6 7 8 9


# 22.try - except 语句
# try:
#     检测范围
# except Exception[as reason]:
#     出现异常后的处理代码
# try 语句按照如下方式工作：
#
# 首先，执行try子句（在关键字try和关键字except之间的语句）
# 如果没有异常发生，忽略except子句，try子句执行后结束。
# 如果在执行try子句的过程中发生了异常，那么try子句余下的部分将被忽略。
# 如果异常的类型和except之后的名称相符，那么对应的except子句将被执行。最后执行try - except语句之后的代码。
# 如果一个异常没有与任何的except匹配，那么这个异常将会传递给上层的try中。
dict1 = {'a': 1, 'b': 2, 'v': 22}
try:
    x = dict1['y']
except LookupError:
    print('查询错误')
except KeyError:
    print('键错误')
else:
    print(x)


# 示例
def divide(x, y):
    try:
        result = x / y
        print("result is", result)
    except ZeroDivisionError:
        print("division by zero!")
    finally:
        print("executing finally clause")


divide(2, 1)
# result is 2.0
# executing finally clause
divide(2, 0)
# division by zero!
# executing finally clause
divide("2", "1")
